package com.gxc.recursion;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 孙悟空爱吃蟠桃，有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵桃树，每颗树上都有桃子，守卫将在 H 小时后回来。
 *
 * 孙悟空可以决定他吃蟠桃的速度K（个/小时），每个小时选一颗桃树，并从树上吃掉 K 个，如果树上的桃子少于 K 个，则全部吃掉，并且这一小时剩余的时间里不再吃桃。
 *
 * 孙悟空喜欢慢慢吃，但又想在守卫回来前吃完桃子。
 *
 * 请返回孙悟空可以在 H 小时内吃掉所有桃子的最小速度 K（K为整数）。如果以任何速度都吃不完所有桃子，则返回0。
 *
 * 输入描述
 * 一行输入为 N 个数字，N 表示桃树的数量，这 N 个数字表示每颗桃树上蟠桃的数量。
 *
 * 第二行输入为一个数字，表示守卫离开的时间 H。
 *
 * 其中数字通过空格分割，N、H为正整数，每颗树上都有蟠桃，且 0 < N < 10000，0 < H < 10000。
 *
 * 输出描述
 * 吃掉所有蟠桃的最小速度 K，无解或输入异常时输出 0。
 */
public class MinSpeed {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] peaceCount = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int h = scanner.nextInt();
        scanner.close();

        int n = peaceCount.length;
        if (n == 0 || h < n) {
            System.out.println("0");
            return;
        }

        Arrays.sort(peaceCount);
        int l = 0, r = peaceCount[n-1]+1;
        while (l < r) {
            // 计算中间值
            int mid = (l + r) / 2;
            // 如果以mid的速度可以在h小时内吃完桃子，则尝试更小的速度
            if (check(peaceCount, h, mid)) {
                r = mid;
            } else {
                // 否则尝试更大的速度
                l = l + 1;
            }
        }
        System.out.println(r);
    }

    private static boolean check(int[] peaceCount, int h, int speed) {
        int time = 0;
        for (int i : peaceCount) {
            time += Math.ceil(i * 1.0 / speed);
        }
        return time<=h;
    }
}
